package cn.edu.hyit.hjq.volunteems.backend.controller;

import cn.edu.hyit.hjq.volunteems.backend.dto.reault.JsonResult;
import cn.edu.hyit.hjq.volunteems.backend.pojo.PointRecord;
import cn.edu.hyit.hjq.volunteems.backend.service.PointRecordService;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 积分记录控制器
 *
 * @module 积分服务
 */
@Controller
@RequestMapping("/point-record")
@PreAuthorize("hasRole('ADMIN')") // 只有 ADMIN 角色可以访问
public class PointRecordController {

    private final PointRecordService pointRecordService;

    // 构造函数注入 PointRecordService
    public PointRecordController(PointRecordService pointRecordService) {
        this.pointRecordService = pointRecordService;
    }

    /**
     * 用户积分记录管理接口
     * 提供对积分记录的增删改查操作
     */
    @GetMapping("/list")
    @ResponseBody
    public JsonResult<List<PointRecord>> listPointRecords(
            @RequestParam String userId,
            @RequestParam Integer page,
            @RequestParam Integer size) {
        List<PointRecord> records = pointRecordService.listPointRecords(userId, page, size);
        return JsonResult.success(records);
    }

    /**
     * 添加积分记录接口
     * 用于新增一条积分记录，请求体包含必要的积分信息
     *
     * @param pointRecord 包含积分记录信息的对象
     * @return JsonResult<String> 返回操作结果，成功时返回200
     */
    @PostMapping("/add")
    @ResponseBody
    public JsonResult<String> addPointRecord(@RequestBody PointRecord pointRecord) {
        pointRecordService.addPointRecord(pointRecord);
        return JsonResult.success("积分记录添加成功");
    }

    /**
     * 更新指定ID的积分记录接口
     * 根据路径中的ID更新对应的积分记录信息
     *
     * @param id 唯一标识符，用于确定需要更新的积分记录
     * @param pointRecord 包含新数据的积分记录对象
     * @return JsonResult<String> 返回操作结果，成功时返回200
     */
    @PutMapping("/update/{id}")
    @ResponseBody
    public JsonResult<String> updatePointRecord(@PathVariable Long id, @RequestBody PointRecord pointRecord) {
        pointRecordService.updatePointRecord(id, pointRecord);
        return JsonResult.success("积分记录更新成功");
    }

    /**
     * 删除指定ID的积分记录接口
     * 根据路径中的ID删除对应的积分记录
     *
     * @param id 要删除的积分记录ID
     * @return JsonResult<String> 返回操作结果，成功时返回200
     */
    @DeleteMapping("/delete/{id}")
    @ResponseBody
    public JsonResult<String> deletePointRecord(@PathVariable Long id) {
        pointRecordService.deletePointRecord(id);
        return JsonResult.success("积分记录删除成功");
    }

    /**
     * 获取单条积分记录详情接口
     * 根据指定的ID查询积分记录的详细信息
     *
     * @param id 唯一标识符，用于确定需要获取的积分记录
     * @return JsonResult<PointRecord> 返回操作结果，成功时返回200及对应的积分记录对象
     */
    @GetMapping("/detail/{id}")
    @ResponseBody
    public JsonResult<PointRecord> getPointRecordDetail(@PathVariable Long id) {
        PointRecord record = pointRecordService.getPointRecordDetail(id);
        return JsonResult.success(record);
    }
}
